home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Graphics Plus
/
Graphics Plus.iso
/
msdos
/
viewers
/
showgl19
/
getargs.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-08-18
|
8KB
|
328 lines
#pragma linesize(132)
/* getargs.c a UNIX-like switch reading routine
Copyright 1991, 1992, Robert C. Becker, Lantern Systems */
/* version 2.0
22 July, 1992. Added -70, -75 options for emulation of HP 7470 and 7475
plotters. These plotters start up with relative character sizing. The
DraftPro and the HPGL/2 spec set the default char size to absolute. Also
removed istok () as dead code and modified getflags () to make better
use of pointers.
/* version 1.5
Added -db flag to turn on debugging output */
/*
valid option flags:
A 8.5 x 11 inch paper
B 11 x 17 inch paper
C 17 x 22 inch paper
D 22 x 34 inch paper
E 34 x 44 inch paper
A4 210 x 297 mm paper
A3 297 x 420 mm paper
A2 420 x 594 mm paper
A1 594 x 841 mm paper
A0 841 x 1189 mm paper
c force CGA 640 x 200 mode
e force EGA 640 x 350 mode
v force VGA 640 x 480 mode
dp assume HP DraftPro coordinate system (center of page = (0,0)
db turn on debugging output
Note that options are case sensitive.
*/
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#include "graph.h" /* need this for video device definitions */
#include "hpgl.h"
#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
#define ERR_F 0x1F
#define FNAME_LEN 128 /* length of longest MSDOS filename */
#define EXIT1 1
static void nfexit (int, char *);
static void clear_flags ( void );
static int setflags ( int );
static void setopt_values ( int );
static void getflags ( char * );
static char copyright[] = "Copyright 1991, Robert C. Becker, Lantern Systems";
static char cf, ef, vf, Af, Bf, Cf, Df, Ef, A4f, A3f, A2f, A1f, A0f, dbf, dpf,
f70, f75;
static char *progname; /* pointer to program name */
static char **files;
static char *path; /* file found at requested directory path */
static char *dpath; /* directory pathname */
static char fname_bfr [FNAME_LEN]; /* handy buffer for file names */
static char tokens[] = "c e v A B C D A4 A3 A2 A1 A0 db dp 70 75";
struct _vid_x_parm_ *forced_video [] = { CGA_640x200, CGA_640x200, EGA_640x350,
VGA_640x480 }; /* use CGA_640x200 to fill space */
#define VIDEO_AUTO 0
#define CGA_mode 1
#define EGA_mode 2
#define VGA_mode 3
struct option
{
char *opt; /* option char. string */
int length; /* length of option char string to match */
int opt_value; /* value of option */
};
static struct option optarray[] =
{
{ "c", 1, CGA_mode}, /* these values correspond to array indices in */
{ "e", 1, EGA_mode}, /* in forced_video[] */
{ "v", 1, VGA_mode},
{ "A4", 2, A4_paper},
{ "A3", 2, A3_paper},
{ "A2", 2, A2_paper},
{ "A1", 2, A1_paper},
{ "A0", 2, A0_paper},
{ "db", 2, Debug_flag},
{ "dp", 2, DRAFTPRO},
{ "A", 1, A_paper},
{ "B", 1, B_paper},
{ "C", 1, C_paper},
{ "D", 1, D_paper},
{ "E", 1, E_paper},
{ "70", 2, F_70},
{ "75", 2, F_75},
{ "", 0, 0} /* end of struct */
};
static struct options cmd_options;
/*----------------------------------*/
static void nfexit (int val, char *opt)
{
printf ("\n%s: ", progname);
printf ("unknown option: %s\n", opt);
printf ("usage: %s [-%s] <file>\n", progname, tokens);
exit (val);
}
/*----------------------------------*/
static void clear_flags ( void )
{
Af = Bf = Cf = Df = Ef = 0;
A4f = A3f = A2f = A1f = A0f = 0;
cf = ef = vf = 0;
dbf = 0;
dpf = 0;
f70 = f75 = 0;
return;
}
/*----------------------------------*/
static int setflags (int flag)
{
switch(flag)
{
case 0: cf = TRUE; /* force CGA mode */
cmd_options.video = optarray[flag].opt_value;
break;
case 1: ef = TRUE; /* force EGA mode */
cmd_options.video = optarray[flag].opt_value;
break;
case 2: vf = TRUE; /* force VGA mode */
cmd_options.video = optarray[flag].opt_value;
break;
case 3: A4f = TRUE; /* A4 paper */
setopt_values (flag);
break;
case 4: A3f = TRUE; /* A3 paper */
setopt_values (flag);
break;
case 5: A2f = TRUE; /* A2 paper */
setopt_values (flag);
break;
case 6: A1f = TRUE; /* A1 paper */
setopt_values (flag);
break;
case 7: A0f = TRUE; /* A0 paper */
break;
case 8: dbf = TRUE; /* debug mode */
cmd_options.debug = optarray[flag].opt_value;
break;
case 9: dpf = TRUE; /* draftpro mode */
cmd_options.plotter = optarray[flag].opt_value;
break;
case 10: Af = TRUE; /* A paper */
setopt_values (flag);
break;
case 11: Bf = TRUE; /* B paper */
setopt_values (flag);
break;
case 12: Cf = TRUE; /* C paper */
setopt_values (flag);
break;
case 13: Df = TRUE; /* D paper */
setopt_values (flag);
break;
case 14: Ef = TRUE; /* E paper */
setopt_values (flag);
break;
case 15: f70 = TRUE; /* 7470 flag */
cmd_options.plotter = optarray[flag].opt_value;
break;
case 16: f75 = TRUE; /* 7475 flag */
cmd_options.plotter = optarray[flag].opt_value;
break;
default: break;
}
return (TRUE); /* return constant value for cheap programming simplification */
}
/*----------------------------------*/
static void setopt_values (int index)
{
cmd_options.paper = optarray[index].opt_value;
return;
}
/*----------------------------------*/
static void getflags (char *args)
{
int i, j, index, ind=FALSE;
while (*args != '\0')
{
for (j = 0; ; j++)
{
if (optarray[j].opt[0] == *args)
{
if (optarray[j].length == 1)
{
ind = setflags (j);
++args;
break;
}
if (optarray[j].opt[1] == *(args + 1))
{
ind = setflags (j);
args += 2; /* skip to next char */
break;
}
}
if ( !optarray[j].length ) nfexit (EXIT1, args); /* flag not found in list */
}
}
return;
}
/*----------------------------------*/
struct options *getargs (int argc, char **argv)
{
char *s;
path = (char *) calloc (1, 215);
dpath = (char *) calloc (1, 215);
cmd_options.paper = A_paper; /* set default paper type to A-size */
cmd_options.video = 0; /* initialize video and papersize to defaults */
cmd_options.plotter = 0; /* no plotter specified: default to HPGL/2 spec */
cmd_options.debug = 0; /* no debugging output */
s = progname = *argv++;
--argc;
while (*s) /* get program name */
{
if (*s == ':' || *s == '\\' || *s == '/')
progname = s + 1;
++s;
}
strlwr (progname);
clear_flags (); /* zero all flags */
if (**argv == '-')
{
while ( *(s = *argv) && (*s == '-')) /* if we have command line flags, */
{ /*ignore environment defaults */
++argv;
--argc;
++s; /* skip leading '-' */
getflags (s);
}
}
else
{
if ((s=getenv ("HPGL")) != NULL)
{
getflags (s); /* get environment default flags */
}
}
/* check for more than one paper size selected */
if (Af + Bf + Cf + Ef + A4f + A3f + A2f + A1f + A0f > 1)
{
printf ("%s: more than one paper size options selected\n", progname);
exit (1);
}
if ((dpf != 0 && (f70 != 0 || f75 != 0)) || (f70 != 0 && f75 != 0))
{
printf ("%s: more than one plotter type selected\n", progname);
exit (1);
}
if (cf + ef + vf > 1)
{
printf ("%s: ignoring multiple video adapter modes\n", progname);
cmd_options.video = VIDEO_AUTO; /* use automatic mode selection */
}
if (argc < 1)
{ /* use stdin */
cmd_options.infile = stdin;
}
else
{ /* get filename */
strcpy (path, *argv);
cmd_options.infile = fopen (path, "r"); /* returns NULL if no file */
}
return (&cmd_options);
}